# Scraping Data with Python

So I reached a point where I needed to get data from a 3rd party portal to send on to customers. 

I've got access to the backend but there's no API so making the data useful in a customer context requires some hacking. 

I ended up going with the Python Requests library and used Xpath

```
# create sesson
session_requests = requests.session()
# extract CSRF token using xpath and lxml
login_url = "https://example.com/login.php"
result = session_requests.get(login_url)
tree = html.fromstring(result.text)
authenticity_token = list(
set(tree.xpath("//input[@name='loginSubmit']/@value")))[0]

# login & send payload
result = session_requests.post(
login_url,
data=payload,
headers=dict(referer=login_url)
)
```
## Lessons learned
Load all the assets
- Interestingly it's important that you load all the assets (css and js) from the page to keep the scraper looking like a normal web client. Call it stealthy if you like.

- Useful for legacy integration.
Scraping if not used maliciously can actually save lots of integration time. When dealing with legacy systems managed by 3rd parties it's an indispensable technique. 

- Consider the resource you're scraping
Always consider if the 3rd party is ok with you doing this. In my case I have permission to use the information.

- Remember the CSRF token
CSRF tokens are a security measure to protect against bots. We're writing a scraping bot. But thankfully simpler forms are easy to submit - just include the CSRF token in the request after you identify and scrape it.

-Chasing a moving target
Sites that change structure frequently are harder to scrape consistently. There will always be times when scraping breaks and needs re-adjustment.

## Next Challenge
Scraping JS table data.

